package com.wh.minihelp.weixin.service;

import static com.wh.minihelp.filter.FunctionsFilter.Method;
import static com.wh.minihelp.filter.FunctionsFilter.Server;

import java.io.IOException;
import java.io.InputStream;
import java.util.Map;

import javax.servlet.ServletException;

import com.wh.minihelp.filter.IFunctionContext;
import com.wh.minihelp.filter.IFunctionService;
import com.wh.minihelp.user.dao.UserDao;
import com.wh.minihelp.user.service.UserService;
import com.wh.minihelp.weixin.util.MessageUtil;
import com.wh.web.util.lang.StringUtil;
import com.wh.web.util.log.Logs;

public class WeixinService implements IFunctionService {

	public static final String Module = "wx";

	public static final String WXID = "wxId";

	private IFunctionContext ctx;

	private String wxId;

	@Override
	public void dispather(IFunctionContext fctx, String method) throws ServletException, IOException {
		this.ctx = fctx;
		dispatchWeixin();
	}

	private void dispatchWeixin() throws IOException {
		// signature 微信加密签名，signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
		// timestamp 时间戳
		// nonce 随机数
		// echostr 随机字符串
		String signature = ctx.getParameter("signature");
		String timestamp = ctx.getParameter("timestamp");
		String nonce = ctx.getParameter("nonce");
		String echostr = ctx.getParameter("echostr");
		// Logs.println("signature = " + signature + " timestamp = " + timestamp
		// + " nonce = " + nonce + " echostr = " + echostr);
		String content = "";
		try {
			InputStream in = ctx.getRequestInputStream();
			Map<String, String> receive = MessageUtil.parseReceiveMsg(in, ctx.getRequestCharacterEncoding());
			this.wxId = receive.get("FromUserName");
			if (StringUtil.empty(echostr)) {
				content = receive.get("Content");
				if (content != null) {
					content = content.trim();
					if ("找回密码".equals(content)) {
						UserDao dao = ctx.getDao(UserDao.class);
						content = dao.resetUserPassword(this.wxId);
						if (content != null) {
							content = "您的新密码：" + content + "\r\n" + getFunctionInfo();
							content = MessageUtil.sendTextmessage(wxId, receive.get("ToUserName"), content);
							ctx.message(content);
							return;
						}
					}
				}
				content = getHelpInfo();
				content = MessageUtil.sendTextmessage(wxId, receive.get("ToUserName"), content);
				ctx.message(content);
			} else {
				ctx.message(echostr != null ? echostr : "");
			}
		} catch (Throwable e) {
			Logs.println(e);
			ctx.message(echostr != null ? echostr : "");
		}
	}

	private String getHelpInfo() {
		return "您发送的消息已收到，欢迎使用下面的功能：\r\n" + getFunctionInfo();
		// return "点击<a href=\"" + Server + "res/calc.html\">这里，使用小小助手！</a>。";//
		// content = "您可以发送文本或语音到本订阅号，订阅号将竭诚为您提供『智能』服务！";
		// return "点击<a href=\"" + Server +
		// "\">小红花</a>为小孩记录小红花。"//
		// + "绑定后还可以这样来记录小红花：\r\n"//
		// + "发送“F数字 说明”可增减加小红花。\r\n"//
		// + "如“F2 作业写的很好”将为小孩增加两个红花，增加原因记录为“作业写的很好”。\r\n"//
		// + "“F-20 购买悠悠球”将把小孩的红花减去20个，减少原因记录为“购买悠悠球”。\r\n"//
		// + "如有多个小孩，需发送“F数字 C数字 说明”样式的消息，C后的数字表示是给第几个小孩记录的。\r\n"//
		// + "发送“FC数字”可以查看小孩当前的红花统计情况。";
	}

	private String getFunctionInfo() {
		return "<a href=\"" + Server + "/" + UserService.Module //
				+ "?" + Method + "=" + UserService.MD_WX//
				+ "&" + WXID + "=" + wxId + "\">红花记事</a>";
	}

	// private String parseContent(String content) throws ServletException,
	// IOException {
	// if (content == null || content.length() == 0) {
	// return getHelpInfo();
	// } else {
	// content = content.trim();
	// String tmp = content.toUpperCase();
	// if (!tmp.startsWith("F")) return getHelpInfo();
	// if (tmp.startsWith("FC")) {
	// int cIndex = 1;// 统计哪个小孩的红花数
	// try {
	// cIndex = Integer.parseInt(tmp.trim().substring(2));
	// } catch (Throwable e) {}
	// return childFlowersInfo(UserUtil.getUser(ctx), cIndex);
	// }
	// int p1 = tmp.indexOf(' ');
	// if (p1 == -1) return getHelpInfo();
	// int fCount = 0;// 增减红花数
	// try {
	// fCount = Integer.parseInt(tmp.substring(1, p1));
	// } catch (Throwable e) {
	// return getHelpInfo();
	// }
	// int cIndex = 1;// 增加哪个小孩的红花数
	// p1 = p1 + 1;
	// if (tmp.charAt(p1) == 'C') {
	// int p2 = tmp.indexOf(' ', p1);
	// try {
	// cIndex = Integer.parseInt(tmp.substring(p1 + 1, p2));
	// p1 = p2 + 1;
	// } catch (Throwable e) {
	// return getHelpInfo();
	// }
	// }
	// ctx.getDao(FlowerDao.class).changeFlower(UserUtil.getUser(ctx), cIndex,
	// fCount, content.substring(p1).trim());
	// return childFlowersInfo(UserUtil.getUser(ctx), cIndex);
	// }
	// }
	//
	// // FIXME:统计小孩红花数
	// private String childFlowersInfo(AccountInfo accountInfo, int cIndex) {
	// List<AccountChild> childs = ctx.getDao(ChildDao.class)
	// .getChilds(accountInfo);
	// int size = childs.size();
	// if (size == 0) {
	// return getNoChildHelpInfo();
	// }
	// ChildInfo child = null;
	// if (cIndex < 0) {
	// child = childs.get(0).getChild();
	// } else if (cIndex >= size) {
	// child = childs.get(size - 1).getChild();
	// } else {
	// child = childs.get(cIndex).getChild();
	// }
	// return child.getName() + " 总得到" + child.getTotals() + "个，已用"
	// + child.getUsed() + "个，剩余"
	// + (child.getTotals() - child.getUsed()) + "个。";
	// //
	// }

	// // 检测是否已经绑定了微信，如果已经绑定，将帐号信息放到ctx中
	// private boolean bindWeinxin() {
	// // FIXME:微信每发一条消息会有一个session吗？
	// AccountInfo account = ctx.getDao(UserDao.class).getAccountByWX(wxId);
	// if (account == null) return false;
	// UserUtil.setUser(ctx, account);
	// return true;
	// }
	//
	// private String getNoChildHelpInfo() {
	// return "您尚未添加任何小孩信息，<a href=\"" + Server + "/"
	// + FlowerService.Module + "?" + Method + "="
	// + FlowerService.MD_ToAddChild + "&" + WXID + "=" + wxId
	// + "\">点击这里添加小孩信息，</a>。"//
	// ;
	// }
	//
	// private String getBindHelpInfo() {
	// // 输入：“帐号密码”，获取您绑定的帐号和密码信息
	// return "<a href=\"" + Server + "/" + UserService.Module + "?" + Method + "=" + UserService.MD_toBind + "&" + WXID + "=" + wxId + "\">点击这里绑定帐号，</a>" + "为小孩记录小红花。"//
	// + "绑定后还可以这样来记录小红花：\r\n"//
	// + "发送“F数字 说明”可增减加小红花。\r\n"//
	// + "如“F2 作业写的很好”将为小孩增加两个红花，增加原因记录为“作业写的很好”。\r\n"//
	// + "“F-20 购买悠悠球”将把小孩的红花减去20个，减少原因记录为“购买悠悠球”。\r\n"//
	// + "如有多个小孩，需发送“F数字 C数字 说明”样式的消息，C后的数字表示是给第几个小孩记录的。\r\n"//
	// + "发送“FC数字”可以查看小孩当前的红花统计情况。";
	// }
}